home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / pascal / csdudes.exe / PDXTBL.CPP < prev    next >
Text File  |  1992-03-12  |  9KB  |  348 lines

  1. /*┌───────────────────────────────────────────────────────────────────────┐
  2.   │                                                                       │
  3.   │   Module:  PDXTBL.CPP                                                 │
  4.   │   Author:  Rick Kligman                                               │
  5.   │   Purpose: Code for Base Class table which handles Paradox Engine     │
  6.   │             Database stuff                                            │
  7.   │   Last Modified: 05-17-91 00:34am                                     │
  8.   │                                                                       │
  9.   │   Copyright 1991 Rick Kligman                                         │
  10.   │   This code may be freely used and distributed in commercial apps     │
  11.   │   provided some mention of PXBuddy++ is made in the documentation.    │
  12.   │                                                                       │
  13.   │   Version 1.00                                                        │
  14.   └───────────────────────────────────────────────────────────────────────┘ */
  15.  
  16. #include "pdxtbl.hpp"
  17.  
  18. #define Uses_MsgBox
  19. #include <tv.h>        // added for messageBox support
  20.  
  21. //    ╓───────────────────────────────────────────────────────────────╖
  22. //    ║                 Constructor for pxtable class                 ║
  23. //    ╚═══════════════════════════════════════════════════════════════╝
  24.  
  25. pxtable::pxtable()
  26. {
  27.   first_open      = 1;        // this will be first time table is opened
  28.   tbl_open        = 0;        // table is not open
  29.   blanks_as_zeros = TRUE;     // write blanks as zeros
  30. }
  31.  
  32. //    ╓───────────────────────────────────────────────────────────────╖
  33. //    ║                 Destructor for pxtable class                  ║
  34. //    ╚═══════════════════════════════════════════════════════════════╝
  35.  
  36. pxtable::~pxtable()
  37. {
  38.   if ( ! first_open )
  39.         delete fldptr;
  40.   if ( tbl_open )
  41.         PXTblClose(th);
  42. }
  43.  
  44. //    ╓───────────────────────────────────────────────────────────────╖
  45. //    ║                         Open a Table                          ║
  46. //    ╚═══════════════════════════════════════════════════════════════╝
  47.  
  48. int pxtable::open(char *tablename, FIELDHANDLE fh)
  49. {
  50.   int   err;
  51.  
  52.   if ( *tablename != NULL) {
  53.         strcpy(tblname, tablename);
  54.         if (! first_open)
  55.              delete fldptr;
  56.         first_open = 1;
  57.   }
  58.  
  59.   err = PXTblOpen(tblname, &th, fh, 0);
  60.   CKERR;
  61.   err = PXRecBufOpen(th, &rh);
  62.   if ( ! err ) {
  63.         err = PXRecBufEmpty(rh);
  64.         if ( ! err )
  65.              if ( first_open ) {
  66.                   err = PXRecNFlds(th, &numflds);
  67.                   if ( ! err ) {
  68.                         fldptr = new absfld * [numflds + 1];
  69.                         first_open = 0;
  70.                         init_flds();
  71.                         PXKeyNFlds(th, &keyed);     // determine if table is keyed
  72.                   }
  73.              }
  74.   }
  75.  
  76.   if ( err )
  77.         PXTblClose(th);
  78.   else
  79.         tbl_open = 1;         // table is now open
  80.  
  81.   return err;       // will be PXSUCCESS if everything is OK
  82. }
  83.  
  84. //    ╓───────────────────────────────────────────────────────────────╖
  85. //    ║                        Close a Table                          ║
  86. //    ╚═══════════════════════════════════════════════════════════════╝
  87.  
  88. int pxtable::close()
  89. {
  90.   int   err;
  91.  
  92.   err = PXRecBufClose(rh);
  93.   CKERR;
  94.  
  95.   err = PXTblClose(th);
  96.  
  97.   if ( ! err )
  98.         tbl_open = 0;         // table is now closed
  99.  
  100.   return err;
  101. }
  102.  
  103. //    ╓───────────────────────────────────────────────────────────────╖
  104. //    ║       Read the record and then ALL fields in a Table          ║
  105. //    ╚═══════════════════════════════════════════════════════════════╝
  106.  
  107. int pxtable::read_rec()
  108. {
  109.   int     err;
  110.  
  111.   err = recget();
  112.   CKERR;
  113.  
  114.   err = read_flds();
  115.  
  116.   return err;
  117. }
  118.  
  119. //    ╓───────────────────────────────────────────────────────────────╖
  120. //    ║                   Read ALL fields in a Table                  ║
  121. //    ╚═══════════════════════════════════════════════════════════════╝
  122.  
  123. int pxtable::read_flds()
  124. {
  125.   int     err;
  126.  
  127.   PXNetTblRefresh(th);        //aff
  128.   for (int i = 0; fldptr [i] != NULL; i++) {
  129.         err = fldptr [i]->get();
  130.         CKERR;
  131.   }
  132.  
  133.   return (PXSUCCESS);
  134. }
  135.  
  136. //    ╓───────────────────────────────────────────────────────────────╖
  137. //    ║        Write ALL fields in a Table and then the record        ║
  138. //    ╚═══════════════════════════════════════════════════════════════╝
  139. // put
  140. /* int pxtable::recupdate()
  141. {
  142.  
  143.     int     err;
  144.  
  145.     err = put_flds();
  146.     CKERR;
  147.  
  148.     err = PXRecUpdate(th, rh);
  149.     return err;
  150. }*/
  151.  
  152. // changed recupdate as per PDOX engine users guide for record locking
  153. //  pg. 85 Engine User's guide
  154. // 2-19-92
  155. int pxtable::recupdate()
  156. {
  157.     int iLock;
  158.     int answer=0;
  159.  
  160.     iLock = PXNetRecLock(th, &lh);
  161.     switch(iLock)
  162.     {
  163.         case PXERR_RECDELETED:    answer = deletedRec();
  164.                                         break;
  165.         case PXSUCCESS:            answer=updateRec();
  166.                                         break;
  167.         default:                        messageBox(PXErrMsg(iLock), mfError);
  168.                                         answer=FALSE;
  169.                                         break;
  170.     }
  171.     return(answer);
  172. }
  173. // =====================================================================
  174. int pxtable::updateRec()
  175. {
  176.     int answer=0;
  177.     int err;
  178.  
  179.     put_flds();
  180.     if((err = PXRecUpdate(th, rh)) != PXSUCCESS)
  181.     {
  182.         messageBox(PXErrMsg(err), mfError);
  183.         answer = FALSE;
  184.     }
  185.     if((err = PXNetRecUnlock(th, lh)) != PXSUCCESS)
  186.     {
  187.         messageBox(PXErrMsg(err), mfError);
  188.         return FALSE;
  189.     }
  190.     return(answer);
  191. }
  192. // =====================================================================
  193. int pxtable::deletedRec()
  194. {
  195.     ushort iUpdate;
  196.     int answer=0, err;
  197.  
  198.     iUpdate = messageBox("Another User has deleted record\nInsert Record?", mfYesButton | mfNoButton);
  199.     if(iUpdate == cmYes)
  200.     {
  201.         if((err = recappend() ) != PXSUCCESS)
  202.         {
  203.             messageBox(PXErrMsg(err), mfError);
  204.             answer = FALSE;
  205.         }
  206.         else
  207.             answer = TRUE;
  208.     }
  209.     return(answer);
  210. }
  211. // =====================================================================
  212. //    ╓───────────────────────────────────────────────────────────────╖
  213. //    ║        Write ALL fields in a Table and then the record        ║
  214. //    ╚═══════════════════════════════════════════════════════════════╝
  215. // put
  216. int pxtable::recappend()
  217. {
  218.   int     err;
  219.  
  220.   err = put_flds();
  221.   CKERR;
  222.   err = PXRecAppend(th, rh);
  223.   return err;
  224. }
  225.  
  226. //    ╓───────────────────────────────────────────────────────────────╖
  227. //    ║        Write ALL fields in a Table and then the record        ║
  228. //    ╚═══════════════════════════════════════════════════════════════╝
  229. // put
  230. int pxtable::recinsert()
  231. {
  232.   int     err;
  233.  
  234.   err = put_flds();
  235.   CKERR;
  236.   err = PXRecInsert(th, rh);
  237.  
  238. //  err = recinsert();
  239.  
  240.   return err;
  241. }
  242.  
  243. //    ╓───────────────────────────────────────────────────────────────╖
  244. //    ║                  Write ALL fields in a Table                  ║
  245. //    ╚═══════════════════════════════════════════════════════════════╝
  246.  
  247. int pxtable::put_flds()
  248. {
  249.   int     err;
  250.     for (int i = 0; fldptr [i] != NULL; i++) {
  251.         err = fldptr [i]->put();
  252.         CKERR;
  253.   }
  254.  
  255.   return (PXSUCCESS);
  256. }
  257.  
  258. //    ╓───────────────────────────────────────────────────────────────╖
  259. //    ║                 Get Next Record in the Table                  ║
  260. //    ╚═══════════════════════════════════════════════════════════════╝
  261.  
  262. int pxtable::recnext()
  263. {
  264.   int   err;
  265.     PXNetTblRefresh(th);  //aff
  266.     err = PXRecNext(th);
  267.     if ( err == PXERR_ENDOFTABLE ) {
  268.         // err = PXSUCCESS;
  269.         tblmarker = TRUE;
  270.   }
  271.   else
  272.         tblmarker = FALSE;
  273.  
  274.   return err;
  275. }
  276.  
  277. //    ╓───────────────────────────────────────────────────────────────╖
  278. //    ║                 Get Prev Record in the Table                  ║
  279. //    ╚═══════════════════════════════════════════════════════════════╝
  280.  
  281.  
  282. int pxtable::recprev()
  283. {
  284.     int   err;
  285.     PXNetTblRefresh(th);        //aff
  286.     err = PXRecPrev(th);
  287.     if ( err == PXERR_STARTOFTABLE ) {
  288.         err = PXSUCCESS;
  289.         tblmarker = TRUE;
  290.   }
  291.     else
  292.         tblmarker = FALSE;
  293.  
  294.     return err;
  295. }
  296. // ==================================================================
  297. //   ******** A. Frantz additions start here  ***********************
  298. // ==================================================================
  299.  
  300. int pxtable::recfirst()
  301. {
  302.     int   err;
  303.     PXNetTblRefresh(th);
  304.     err = PXRecFirst(th);
  305.     if ( err == PXERR